<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // 同步任务： 1 4 6 3 8
    // 宏队列： 2 
    // 微队列： 5 9
    // console.log(1)
    // setTimeout(() => {
    //     console.log(2)
    // }, 1000);
    // async function fn() {
    //     await new Promise((resolve, reject) => {
    //         resolve()
    //         console.log(8)
    //     })
    //     // .then(()=>{
    //     //     console.log(9)
    //     // })
    //     console.log(9)
    // }
    // new Promise((resolve, reject) => {
    //     // 同步执行
    //     console.log(4)
    //     resolve()
    //     console.log(6)
    // }).then(() => {
    //     console.log(5)
    // })
    // console.log(3)
    // fn()

    console.log('==============美团面试题==============')


    // console.log(1);
    // setTimeout(() => {
    //     console.log(2);
    //     Promise.resolve().then((data) => {
    //         console.log(3);
    //     });
    // });
    // new Promise((resolve) => {
    //     resolve();
    //     console.log(4);
    // })
    //     .then(() => {
    //         console.log(5);
    //         setTimeout(() => {
    //             console.log(6);
    //         });
    //     })
    //     .then(() => console.log(7));

    // console.log(8);

    // 代码的执行顺序：先同步任务 然后清空微任务 最后执行宏任务 
    // 在执行下一个宏任务之前一定会把微任务队列中的任务执行完毕

    // 同步任务 ： 
    // 1. new Promise(函数) 这个参数函数也是同步执行的
    // 2. 执行一个async函数的时候  async函数也是同步执行的
    // 3. await 后面跟着的表达式  await后面的表达式也是同步执行的
    // 宏任务：setTimeout setInterval setImmediate 
    // 微任务：Promise.then()  await 下面的代码 类似于在.then中执行的代码


    // 同步任务： A G J
    // 微任务： D H I
    // 下一个宏任务： B
    // 微任务： C 
    // 下一个宏任务： E
    // 微任务： F

    console.log('A');

    setTimeout(() => {
        console.log('B');

        queueMicrotask(() => console.log('C'));
    }, 0);

    Promise.resolve().then(() => {
        console.log('D');
        setTimeout(() => {
            console.log('E');
            Promise.resolve().then(() => {
                console.log('F');
            });
        }, 0);
    });
    (async () => {
        console.log('G');
        await null;
        console.log('H');
    })();
    queueMicrotask(() => {
        console.log('I');
    });
    console.log('J');

</script>

</html>